Использование IDL
Создание любого CORBA-проекта начинается с разработки спецификаций этого проекта на языке IDL. IDL является "сердцем" технологии CORBA. Он позволяет определить абсолютно все аспекты поведения объектов, из которых строится ваша система, которые важны с точки зрения взаимодействия этих объектов между собой. Важно понимать, что никакие детали реализации этих объектов на этапе создания IDL-деклараций во внимание не принимаются. В частности, IDL-декларации совершенно не позволяют делать никаких предположений о наличии или отсутствии состояний ваших объектов - это их "внутреннее дело".
Дизайнеру проекта крайне важно научиться "мыслить" на языке IDL. Он играет для CORBA-проекта роль, во многом схожую с ролью CASE-диаграмм, а именно, позволяет создать достаточно наглядное описание функциональности отдельных составных частей и задать связи между ними на абстрактном уровне. При этом набор IDL-объявлений является скелетом вашей распределенной системы, а не просто описанием, которое нуждается в более детальной проработке на этапе реализации. Большинство изменений, которые вам потребуется внести в систему и которые влияют на характер взаимодействия любого объекта с другими объектами или "внешним миром", должны быть отражены на уровне его IDL-описаний.
IDL является достаточно выразительным языком. Он позволяет определить типы данных, которые необходимы для функционирования вашей системы, включая структуры, объединения, массивы и так называемые "последовательности" (sequences), который можно рассматривать как массивы переменной длины. Главной задачей IDL является определение интерфейсов удаленных объектов, т.е. совокупности удаленных методов, к которым могут обращаться клиенты в процессе работы распределенной системы. IDL позволяет задать списки аргументов, тип возвращаемого результата, а также исключительные ситуации, которые могут быть возбуждены при вызове этого метода.
Вот фрагмент IDL-файла, который является типичным для CORBA-приложения:
module MyModule { typedef struct Str { long key; string description; double value; } MyData; typedef sequence<MYDATA> MyDataList; exception MyException {}; interface MyInerface { MyDataList MyMethod (in long arg) raises (MyException); }; };
Модуль MyModule позволяет определить новое пространство имен для того, чтобы избежать случайного совпадение имен интерфейсов, типов и т.д., созданных различными разработчиками в рамках одной распределенной системы. Следующие два объявления определяют типы данных и их имена, которые будут использоваться при взаимодействии с удаленным объектом, поведение которого (с точки зрения удаленного взаимодействия) задано интерфейсом с именем MyInterface. Этот интерфейс определяет, что клиент может вызвать единственный метод данного объекта, который в качестве входного аргумента требует наличия значения целого типа, а возвращает 0, 1 или несколько структур, каждая из которых содержит три поля. При этом может быть возбуждена исключительная ситуация MyException.
Что получает разработчик, создав такие IDL-объявления?
interface MyInterface : CosTransaction::TransactionalObject {